//
//  YYTableController.swift
//  YYProject
//
//  Created by 陆文宇 on 2017/8/16.
//  Copyright © 2017年 陆文宇. All rights reserved.
//

import UIKit
import Kingfisher

class YYTableController: YYController, UITableViewDataSource, UITableViewDelegate {
    
    var yy_tableView: UITableView!
    var yy_isShowTableHeaderView = false
    var yy_tableHeaderViewHeight: CGFloat = 0
    var yy_dataSource = [YYModel]()
    var yy_page = 1
    var yy_size = 10

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func yy_config() {
        super.yy_config()
        
        yy_createTableView()
    }
    
    final func yy_createTableView() {
        yy_tableView = UITableView(frame: .zero, style: .plain)
        yy_tableView.backgroundColor = .white
        yy_tableView.dataSource = self
        yy_tableView.delegate = self
        yy_tableView.mj_header = MJRefreshNormalHeader(refreshingClosure: { [weak self] in
            if let `self` = self {
                self.yy_tableView.tableHeaderView?.yy_height = self.yy_tableHeaderViewHeight
                self.yy_page = 1
                self.yy_requestData()
            }
        })
        yy_tableView.mj_footer = MJRefreshAutoNormalFooter(refreshingClosure: { [weak self] in
            if let `self` = self {
                self.yy_requestData()
            }
        })
        
        if yy_isShowTableHeaderView {
            yy_tableView.tableHeaderView = view
            yy_tableView.tableHeaderView?.yy_height = yy_tableHeaderViewHeight
        }
        yy_configTableView()
        view = yy_tableView
        
        yy_tableView.mj_header?.state = .refreshing
        yy_registeredCellClasses().forEach { (cellClass) in
            cellClass.yy_register(tableView: yy_tableView)
        }
    }
    
    func yy_configTableView() {
        yy_defaultTableViewConfig()
    }
    
    override func yy_requestData() {
        super.yy_requestData()
        
        yy_tableView.mj_header?.endRefreshing()
        yy_tableView.mj_footer?.endRefreshing()
    }
    
    override func yy_analyzData(_ data: Any) -> [YYModel]? {
        yy_tableView.mj_header?.endRefreshing()
        return super.yy_analyzData(data)
    }
    
    override func yy_handlerData(_ data: [YYModel]?) {
        guard data != nil else {
            return
        }
        
        if yy_page == 1 {
            yy_dataSource = data!
        } else {
            yy_dataSource.append(contentsOf: data!)
        }
        yy_tableView.reloadData()
        yy_page += 1
        
        if data!.count < yy_size {
            yy_tableView.mj_footer?.endRefreshingWithNoMoreData()
            
            if yy_dataSource.isEmpty {
                yy_tableView.yy_showNoMoreData(with: "暂无数据")
            } else {
                yy_tableView.yy_dismissNoMoreData()
            }
        } else {
            yy_tableView.mj_footer?.endRefreshing()
            yy_tableView.yy_dismissNoMoreData()
        }
    }
    
    override func yy_requestFailure(errmsg: String) -> String? {
        yy_tableView.mj_header?.endRefreshing()
        yy_tableView.mj_footer?.endRefreshing()
        return super.yy_requestFailure(errmsg: errmsg)
    }
    
    func yy_registeredCellClasses() -> [YYTableCell.Type] {
        return [YYTableCell.self]
    }
    
    func yy_dequeueReusableCellClass(indexPath: IndexPath) -> YYTableCell.Type {
        return YYTableCell.self
    }
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return yy_dataSource.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = yy_dequeueReusableCellClass(indexPath: indexPath).yy_dequeueReusableCell(tableView: tableView, indexPath: indexPath)
        cell.yy_model = yy_dataSource[indexPath.row]
        return cell
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */

}
